/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/8/28 20:40
 * 线程等待：join方法，线程插队阻塞
 *      线程之间，调度顺序不确定，但是我们希望可控
 *      调用join方法，代码不继续向下进行，等待代用join方法的线程run方法运行完毕后，才继续向下执行
 *
 *      1.join();       无参，表示死等，不运行结束，不向下执行
 *      2.join(long millis);   最多等待millis 毫秒
 *      3.join(long millis, int nanos); 精度更高，纳秒级别
 *
 * sleep()方法 ： 本质上是把线程PCB给从就绪队列，移动到了阻塞队列
 * yield()方法 ： 线程让步，主动让出CPU，yield不改变线程状态，但是会重新排队
 */
public class ThreadDemo12 {
    public static void main(String[] args) {
//        Thread t =new Thread(){
//            @Override
//            public void run() {
//                int count = 0;
//
//                while(count<5){
//                    count ++;
//                    System.out.println("线程运行中.");
//                    try {
//                        Thread.sleep(1000);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                }
//                System.out.println("线程运行结束.");
//            }
//        };
//        //t.start();
//
//        try {
//            //若执行join之前，线程已经结束，则不发生阻塞
//            Thread.sleep(7000);
//            System.out.println("join开始执行");
//            //此处join就会阻塞等待
//            t.join();
//            System.out.println("join执行结束");
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
        //yield 线程让步
        Thread t1 =new Thread(){
            @Override
            public void run() {
                while(true){
                    System.out.println("t1 : "+this.getId());
                    Thread.yield();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread t2 =new Thread(){
            @Override
            public void run() {
                while(true){
                    System.out.println("t2----- : "+this.getId());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        t1.start();
        t2.start();

    }
}
